package com.atguigu.c_designed.m1createModel.c1singleton;

/**
 * 单例设计模式介绍
 * 所谓类的单例设计模式，就是采取一定的方法保证在整个的软件系统中，对某个类只能存在一个对象实例，
 * 并且该类只提供一个取得其对象实例的方法(静态方法)。
 */
public class Singleton04 {

    public static void main(String[] args) {
        //测试
        LazySingleton04 instance = LazySingleton04.getInstance();
        LazySingleton04 instance2 = LazySingleton04.getInstance();
        System.out.println(instance == instance2); // true
        System.out.println("instance.hashCode=" + instance.hashCode());
        System.out.println("instance2.hashCode=" + instance2.hashCode());
    }
}

/**
 * 优缺点说明：
 * 1) 解决了线程安全问题
 * 2) 效率太低了，每个线程在想获得类的实例时候，执行 getInstance()方法都要进行同步。而其实这个方法只执行
 * 一次实例化代码就够了，后面的想获得该类实例，直接 return 就行了。方法进行同步效率太低
 * 3) 结论：在实际开发中，不推荐使用这种方式
 */
// 懒汉式
class LazySingleton04 {
    //构造器私有化
    private LazySingleton04() {
    }

    //本类内部创建对象实例
    private static LazySingleton04 instance;

    //    提供获取实例的方法
    public static synchronized LazySingleton04 getInstance() {
        if (instance == null) {
            instance = new LazySingleton04();
        }
        return instance;
    }
}
